/*
# Trabajo Practico 2 Ejercicio 4 (Servidor)
# Segunda Entrega
#
# - Integrantes:
#	- Martinez, Guillermo	DNI: 34510461
#	- Meli, Marcos			DNI: 31832759
#	- Reyes, Leandro		DNI: 34213699
#	- Rodriguez, Lucas		DNI: 34265017
#	- Cortez, Martin		DNI: 30440023
#
# NOTA: Como la selección de señales queda a elección del programador, solo acolamos señales SIGUSR1
#
*/

#include "defines.h"
#include "fifo/fifo.h"

void trata_signal(int);

int alarma=0;
t_cola cola;
t_info_fifo info_fifo;
FILE* fifo;

int main(void)
{
	int ret_val, random=0;
	
	crearcola(&cola);
	ret_val = mkfifo(FIFO,0666);
	
	if(signal(SIGINT, trata_signal) == SIG_ERR)
		{ printf("Fallo el signal"); exit(-1);}
	if(signal(SIGTERM, trata_signal) == SIG_ERR)
		{ printf("Fallo el signal"); exit(-1);}
	if(signal(SIGUSR1, trata_signal) == SIG_ERR)
		{ printf("Fallo el signal"); exit(-1);}
	if(signal(SIGUSR2, trata_signal) == SIG_ERR)
		{ printf("Fallo el signal"); exit(-1);}	
	if(signal(SIGALRM, trata_signal) == SIG_ERR)
		{ printf("Fallo el signal"); exit(-1);}
	if(signal(SIGPIPE, trata_signal) == SIG_ERR)
		{ printf("Fallo el signal"); exit(-1);}

	fifo = fopen(FIFO, "w");
		if(!fifo)
			{ printf("Error al abrir FIFO\n");  exit(1); }
	
	while(1)
	{
		pause();
		
		// !alarma = podemos enviar a FIFO
		if(!colavacia(&cola) && !alarma)
		{
			sacardecola(&cola, &info_fifo);
			printf("Envio %d\n",info_fifo.random);
			fwrite(&info_fifo.random, sizeof(info_fifo.random),1,fifo);
			alarma=1;
			alarm(2);
		}
		
		fclose(fifo);
		fifo = fopen(FIFO, "w");
		if(!fifo)
			{ printf("Error al abrir FIFO\n");  exit(1); }
	}
}

void trata_signal(int signum)
{
	switch (signum)
	{
		/* Señal para terminar procesos. */
		case SIGTERM:
		case SIGINT:	
			printf("Terminando proceso...\n");
			fclose(fifo);
			vaciarcola(&cola);
			exit(0);
			break;
		
		/* SIGUSR - Señal para crear mensaje. */
		case SIGUSR1:
		case SIGUSR2:	
			info_fifo.random=rand();
			info_fifo.num_signal=signum;
			if(colallena(&cola))
				{ printf("No hay memoria. FIN EJECUCION\n"); exit(-2); }
			ponerencola(&cola, &info_fifo);
			printf("Señal %d recibida, genero random : %d\n", info_fifo.num_signal, info_fifo.random);
			break;
	
		/* SIGALRM - Señal de alarma. */
		case SIGALRM:	
			alarma=0;	// Pasaron 2seg. ya podemos volver a enviar
			break;
		
		case SIGPIPE:
			printf("No existen lectores en el FIFO\n");
			fclose(fifo);
			vaciarcola(&cola);
			exit(0);
			break;
	}
}
